/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._367;



import java.util.List;

/**
 *
 * 给定一个正整数 num，编写一个函数，如果 num 是一个完全平方数，则返回 True，否则返回 False。
 *
 * 说明：不要使用任何内置的库函数，如  sqrt。
 *
 * 示例 1：
 *
 * 输入：16
 * 输出：True
 * 示例 2：
 *
 * 输入：14
 * 输出：False
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._367
 * @ClassName: ValidPerfectSquare
 * @Author: linyaonan
 * @Date: 2019/12/23 15:52
 */
public class ValidPerfectSquare {

    public boolean isPerfectSquare2(int num) {
        if (num <= 0) {
            return false;
        }
        if (num < 10) {
            return num == 1 || num ==4 || num == 9;
        }

        int l = 4;
        int r = 46340;

        while (l <= r) {
            int mid = l + ((r - l) >> 1);
            int t = mid * mid;
            if (t == num) {
                return true;
            } else {
                if (t < num) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }

        return false;
    }

    public boolean isPerfectSquare(int num) {
        if (num <= 0) {
            return false;
        }
        if (num < 10) {
            return num == 1 || num ==4 || num == 9;
        } else {
            String str = String.valueOf(num);
            boolean b = checkIsSquare(str);
            if (!b) {
                return false;
            } else {
                int t = 3;
                while (t * t <= num) {
                    if (t * t == num) {
                        return true;
                    }
                    t++;
                }
                return false;
            }
        }
    }

    private boolean checkIsSquare(String s) {
        boolean isVaild = false;
        char c = s.charAt(s.length() - 2);
        if (s.endsWith("0") && isEven(c)) {
            isVaild = true;
        } else if (s.endsWith("1") && isEven(c)) {
            isVaild = true;
        } else if (s.endsWith("4") && isEven(c)) {
            isVaild = true;
        } else if (s.endsWith("9") && isEven(c)) {
            isVaild = true;
        } else if (s.endsWith("6") && !isEven(c)) {
            isVaild = true;
        } else if (s.endsWith("25")) {
            isVaild = true;
        }
        return isVaild;
    }

    private boolean isEven(char c) {
        int num = Integer.parseInt(c + "");
        return num % 2 == 0;
    }

}
